package com.coderman.infosys.auth.adapter.controller.role;

import com.coderman.infosys.auth.adapter.controller.BaseController;
import com.coderman.infosys.auth.adapter.convert.RoleGroupConverter;
import com.coderman.infosys.auth.domain.bo.role.RoleGroupBO;
import com.coderman.infosys.auth.domain.enums.errors.RoleGroupErrorEnum;
import com.coderman.infosys.auth.domain.repository.UserRoleRepository;
import com.coderman.infosys.plat.auth.common.dto.ResultDataDto;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.coderman.infosys.auth.adapter.vo.role.request.CreateRoleGroupRequestVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;


/**
* @Description:控制层
* @Author:
* @CreateTime:2022-01-04 15:27:39
* @version v1.0
*/
@RestController
public class RoleGroupController extends BaseController {
	
	protected Logger logger = LoggerFactory.getLogger(RoleGroupController.class);

	@Autowired
	private UserRoleRepository userRoleRepository;


	/**
	 *
	 * @Description 创建角色组
	 * @param createRoleRequestVO
	 * @return RoleVO
	 */
	@RequestMapping(value = "/rolegroup/create")
	public ResultDataDto<Boolean> createRole(@RequestBody CreateRoleGroupRequestVO createRoleRequestVO){
		RoleGroupBO roleGroupBO = RoleGroupConverter.INSTANCE.vo2bo(createRoleRequestVO);
		userRoleRepository.saveRoleGroup(roleGroupBO);
		return ResultDataDto.success(true);
	}

	/**
	 *
	 * @Description 禁用角色组
	 * @param roleGroupCode
	 * @return Boolean
	 */
	@RequestMapping(value = "/rolegroup/disable")
	public ResultDataDto<Boolean> disable(@RequestParam(value = "roleGroupCode", required = true)  String roleGroupCode){
		boolean success = userRoleRepository.disableRoleGroup(roleGroupCode);
		if(success){
			return ResultDataDto.success(true);
		}
		return ResultDataDto.fail(RoleGroupErrorEnum.ROLE_GROUP_DISABLE_ERROR);
	}

	/**
	 *
	 *
	 * 在本示例中，禁用和启用是直接进行单表操作的，但是实际情况可能会更复杂，因为角色，角色组等等可能已经被权限资源或者权限
	 * 聚合根引用了，现实情况是进行启用或者禁用可能会有些校验，比如已经关联的不能禁用,或者这个禁用只是一种比较弱的规则，依赖方仍然可以通过一定
	 * 手段来过滤调禁用的信息，比如联表查询等等。
	 * 那么这种禁用的校验逻辑放哪里比较合适呢，领域层？API层？可能都不太合适，这里有两个其他的方向
	 * 1.构建一个validator层，这个层可以稍微做的重一点来承载写之前的一些读校验逻辑
	 * 2.构建一个应用层，在应用层的方法逻辑中构建校验逻辑
	 * 当然,在不同的方案中这个逻辑怎么的都不会太复杂，但是更复杂的写前校验逻辑说明了需要应用层来承接整个写前后的逻辑了
	 *
	 * @Description 启用角色组
	 * @param roleGroupCode
	 * @return Boolean
	 */
	@RequestMapping(value = "/rolegroup/enable")
	public ResultDataDto<Boolean> enable(@RequestParam(value = "roleGroupCode", required = true) String roleGroupCode){
		boolean success = userRoleRepository.enableUserGroup(roleGroupCode);
		if(success){
			return ResultDataDto.success(true);
		}
		return ResultDataDto.fail(RoleGroupErrorEnum.ROLE_GROUP_ENABLE_ERROR);
	}
}
